//============================================================================
/**
 *
 *	@file		break_common.h
 *	@brief		かわらわり 汎用ファイル
 *	@note		主に共通で使用する定数を定義
 *	@author		hosaka genya
 *	@data		2008.11.11
 *
 */
//============================================================================
#pragma once

#include "../../poke_clact_def.h"
#include "system/clact_tool.h"
#include "break_obj_pri.h"
#include "break_comm.h"

//=============================================================================
/**
 *								定数定義
 */
//=============================================================================
#define BREAK_HEAP_SIZE (0x60000)
#define OBJ_DISTANCE (FX32_CONST(256))

enum {
	// --- 自分のポケモン 初期座標 ---
	START_POKE_MINE_POS_X = 128 + 8,
	START_POKE_MINE_POS_Y = 14 * 8,

	// --- 敵のポケモン 初期座標 ---
	START_POKE_ENEMY_POS_X = 9 * 8,
	START_POKE_ENEMY_POS_Y = 8 * 6,
	START_POKE_ENEMY_POS_X_OFS = 8 * 8,

	COMM_BIGPOKE_EFF_DEC = 8 * 2, ///< 通信ポケモンでサイズが大きいものはこのサイズ分小さい

	// --- 敵かわらの座標位置 ---
	// (敵ポケモンからの差)
	SUB_KAWARA_POS_X = START_POKE_ENEMY_POS_X,
	SUB_KAWARA_POS_Y = START_POKE_ENEMY_POS_Y + 8 * 1 ,

	// --- 敵の状態異常アイコンの高さ ---
	SUB_ICON_EFFECT_POS_Y =START_POKE_ENEMY_POS_Y - 8 * 1,

	// --- ボタンのサイズ(当たり判定用) ---
	BTN_CHANGE_SIZE_X = 8*8,
	BTN_CHANGE_SIZE_Y = 4*8,

	// --- ボタンOBJ座標 ---
	BTN_CHANGE_POS_X = 4*8,
	BTN_CHANGE_POS_Y = 2*8,

	// --- 時計アイコン座標 ---
	ICON_TIME_POS_X  = 24 * 8,
	ICON_TIME_POS_Y  = 23 * 8,

	// --- 状態異常アイコン座標 ---
	BREAK_POKE_ICON_DIFF_X = 0,		///< 中心座標からの差 X
	BREAK_POKE_ICON_DIFF_Y = -3*8,	///< 中心座標からの差 Y

	// --- ベンチポケモン座標 ---
	BENCH_POKE_POS_X = 8 * 5,
	BENCH_POKE_POS_Y = 8 * 6,
	BENCH_POKE_POS_Y_OFS = 8 * 11,
	BENCH_POKEEFF_POS_Y_DIFF = -8 * 3,	///< ポケモン座標と状態異常アイコンの差

	// --- 攻撃関係 ---
	ATTACK_SYNC = 10,				///< 攻撃にかかるフレーム数( c_Attack_StaminaDecTblと関連 )
	ATTACK_DERAY_SYNC = 2,			///< 攻撃のディレイ(このフレーム中は入力を受け付けない)
	DAMAGE_CRITICAL = 160,			///< クリティカル時に増加させるダメージ

	// --- スタミナ値 ---
	STAMINA_HEAL_SYNC_NORMAL = 60,	///< 通常時 スタミナ回復にかかるSYNC
	STAMINA_HEAL_POINT_NORMAL = 8,	///< 通常時 スタミナ回復ポイント
	STAMINA_HEAL_SYNC_BENCH = 30,	///< 控え時 スタミナ回復にかかるSYNC
	STAMINA_HEAL_POINT_BENCH = 5,	///< 控え時 スタミナ回復ポイント

	SWEAT_MIN_SPEED = 40,			///< 汗の最低速度(パーセント)

	// --- 気絶値 ---
	PANIC_REFLESH_POINT = 8,		///< 気絶時、スタミナがこの値まで回復したら復活
	PANIC_SWEAT_POINT = 40,			///< このパーセント以下だと汗が出る

	// --- テンション値 ---
	TENSION_MAX = 100,				///< テンションの最大値
	TENSION_AURA = 50,				///< この値からオーラが出始める
	TENSION_SYNC = 90,				///< テンションの継続時間(フレーム)
	TENSION_ADD_BREAK = 0,			///< ブロック破壊時に加算する値
	TENSION_ADD_CRITICAL =	30,		///< クリティカル時に加算する値
	TENSION_DEC_SYNC = 2,			///< このフレーム毎に減算
	TENSION_DEC_CHANGE = 10,		///< 交代時に減算する値
	TENSION_STAMINA_RESET = 10,		///< テンション終了後のスタミナ
	TENSION_AURA_MIN_SPEED = FX32_CONST(0.6),	///< オーラの最低速度
	HIGH_TENSION_DAMAGE_PLUS = 150,	///< ハイテンション時のダメージ上昇値

	// --- 交代 ---
	CHANGE_TP_DIFF = 32,			///< ペン交代時の判定幅
	CHANGE_TP_SYNC = 10,			///< ペン交代判定有効SYNC数
	// ※交代の値を変更するときは保坂まで
	CHANGE_POKEGRA_SYNC = 2,		///< 煙が出てからポケグラが出るまでのフレーム数
	CHANGE_WAIT_SYNC = 4,			///< 掃けているときのフレーム数
	BALL_OUT_TARGET_POS = -64,		///< ボールの目的座標：ボールの移動速度と関連
	BALL_OUT_TARGET_POS_DIFF = 12,	///< ボールの目的座標：ボールの移動速度と関連
	BALL_OUT_SPEED_DIV = 4,			///< 目的座標 - ボールの座標 / この値
	BALL_IN_DEF_POS = -8,			///< ボール投げ 開始座標
	BALL_IN_DEC_POS = 2,			///< 毎フレーム、最低この値移動する
	BALL_IN_DEF_SPD = 16,			///< ボール投げ 開始速度 (1/3)
	BALL_IN_SPEED_DIV = 2,			///< ボールの現在の座標 / この値

	// --- かわら関係 ---
	KAWARA_STD_POS_X = GX_LCD_SIZE_X/2 - 8,	///< かわらの基本座標 X
	KAWARA_STD_POS_Y = 8 * 21,				///< かわらの基本座標 Y
	KAWARA_NUM = 10,			///< かわら数
	KAWARA_DROP_ACCEL = 20,		///< かわら落下時の加速度
	KAWARA_MAKE_SPAN = 2,		///< かわらを生成する間隔(フレーム)
	KAWARA_DOT_HIGHT = 4,		///< かわらの高さ(ドット単位) ※積み重ね時使用
	KAWARA_HP_MAX = 100,		///< かわらのHP最大値
	KAWARA_ANM_CHG_HP_1 = 60,	///< 壊れ段階1に切り替わる条件(残りHP)
	KAWARA_ANM_CHG_HP_2 = 20,	///< 壊れ段階2に切り替わる条件(残りHP)
	BREAK_COUNT_MAX = 200,		///< かわら破壊枚数の最大値

	KAWARA_EFF_ADD_NUM = 4,		///< 同時に発生するカワラ破片の数

	// ヒビ
	CRACK_AREA_X_MAX = 16,
	CRACK_AREA_Y_MAX = 12,
	CRACK_AREA_MAX = 4,

	// --- AI ---
	AI_CHANGE_SYNC = 26,			///< 交代時のウェイト
	AI_ATTACK_SYNC_LOW = 4,			///< 行動間隔の最低値
	AI_ATTACK_SYNC_HIGH = 7,		///< 行動間隔の最高値		[090417編集]
	AI_ADD_IN_WAIT_SYNC = 42,		///< かわら補給ウェイト

	SCR_DEF_OFS = 16,	///< スクリーンのデフォルトオフセット

	// --- System ---
	GAME_FPS = 30,
	GAME_TIME = GAME_FPS * 30,		///< ゲームプレイ時間(フレーム単位)
};

// --- キャンセル攻撃時に減るスタミナ量 ---
static const c_Attack_StaminaDecTbl[ ATTACK_SYNC ] = { 0, 4, 4, 4, 3, 3, 3, 2, 2, 2 };

// --- AI：クリティカル発生確率テーブル ---
#define AI_CRITICAL_TBL_MAX (3)	///< テクニックLVを参照する
static const c_AI_CriticalParTbl[ AI_CRITICAL_TBL_MAX ] = { 4, 8, 16 };		//[090417編集]

// --- AI：攻撃キャンセル確率テーブル ---
#define CANSEL_STA_TBL_MAX (5)
#define CANSEL_TEN_TBL_MAX (4)
// この値以上なら条件を満たす
static const g_Cansel_StaminaCheck[CANSEL_STA_TBL_MAX]		= { 100, 40, 20, 8, 0 };	// スタミナ値
// 条件を満たした時に増える確率値
static const g_Cansel_StaminaAddParsent[CANSEL_STA_TBL_MAX] = { 100, 100, 100, 80, 60 };		//[090417編集]
// この値以上なら条件を満たす
static const g_Cansel_TensionCheck[CANSEL_TEN_TBL_MAX]		= { 100, 90, 80, 70, };			// テンション値
// 条件を満たした時に増える確率値
static const g_Cansel_TensionAddParsent[CANSEL_TEN_TBL_MAX] = { 100, 60, 20, 10, };

// --- AI：交代発生確率テーブル ---
#define CHANGE_TEN_TBL_MAX (3)
#define CHANGE_STA_TBL_MAX (5)
// この値以上なら条件を満たす
static const u16 g_Change_TensionCheck[CHANGE_TEN_TBL_MAX] = { 90, 80, 70 };
// 条件を満たした時に増える確率値
static const s16 g_Change_TensionAddParsent[CHANGE_TEN_TBL_MAX] = { -50, -20, -10 };
// この値未満なら条件を満たす
static const u16 g_Change_StaminaCheck[CHANGE_STA_TBL_MAX] = { 5, 10, 15, 20, 30, };
//{ 30, 20, 15, 10, 5 };
// 条件を満たした時に増える確率値
static const s16 g_Change_StaminaAddParset[CHANGE_STA_TBL_MAX] = { 85, 75, 10, 10, 0 };

//--------------------------------------------------------------
///	テクニックレベル
//==============================================================
typedef enum {
	BREAK_TEC_LV_LOW,
	BREAK_TEC_LV_NORMAL,
	BREAK_TEC_LV_HIGH,
	BREAK_TEC_LV_MAX,
} BREAK_TEC_LV;

//--------------------------------------------------------------
///	ポケモン毎のパラメータ
//==============================================================
typedef struct {
	u32 Pow : 9;
	u32 StaminaMax : 9;
	u32 Stamina : 8;	///< スタミナ
	u32 Tec : 6;
} BREAK_POKE_PARAM; // 4 byte

#define CONV_PARAM_MAX (5)
//--------------------------------------------------------------
///	コンバータから取得する値
//==============================================================
typedef struct {
	int pow[CONV_PARAM_MAX];
	int stamina[CONV_PARAM_MAX];
	int tec[CONV_PARAM_MAX];
} BREAK_POKE_CONV_DATA;

//--------------------------------------------------------------
///	CATS Resource Index
//==============================================================
enum {
	OBJ_ID_MAX = 128,		///< 画面に同時に出現するOBJの上限
	CAP_ALL_NUM = 256,		///< CAPで管理するOBJの上限
	CMN_RES_NUM = 4,		///< 共通リソースの数
	OBJ_POKEGRA_M_MAX = 1,	///< LCD MAIN で使用するポケグラの数
	OBJ_POKEGRA_S_MAX = 2,	///< LCD SUB で使用するポケグラの数
	CATS_RES_TBL_OFS = 10000,

	//-----------------------------------------------------------------------
	// ※CATS＋CLACTの所為でCAP内部のパレットカウンタが進んでいない為、
	// 参照パレットが0列目でないCAPはキメウチでずらす。
	//-----------------------------------------------------------------------
	CATS_CMN_M_PALOFS = 13,	///< PAL_ID_MAIN が読み込まれたオフセット
	CATS_CMN_S_PALOFS = 0,	///< PAL_ID_SUB が読まれたオフセット

	CHR_ID_MAIN = CATS_RES_TBL_OFS,
	CHR_ID_SUB,
	CHR_ID_M_POKEGRA,
	CHR_ID_S_POKEGRA = CHR_ID_M_POKEGRA + OBJ_POKEGRA_M_MAX,
	CHR_ID_END = CHR_ID_S_POKEGRA + OBJ_POKEGRA_S_MAX,
	CHR_ID_MAX = CMN_RES_NUM + CHR_ID_END - CATS_RES_TBL_OFS,

	PAL_ID_MAIN = CATS_RES_TBL_OFS,
	PAL_ID_SUB,
	PAL_ID_S_POKEICON,
	PAL_ID_M_POKEGRA,
	PAL_ID_S_POKEGRA = PAL_ID_M_POKEGRA + OBJ_POKEGRA_M_MAX,
	PAL_ID_END = PAL_ID_S_POKEGRA + OBJ_POKEGRA_S_MAX,
	PAL_ID_MAX = CMN_RES_NUM + PAL_ID_END - CATS_RES_TBL_OFS,

	CEL_ID_MAIN = CATS_RES_TBL_OFS,
	CEL_ID_SUB,
	CEL_ID_POKEGRA,
	CEL_ID_END,
	CEL_ID_MAX = CMN_RES_NUM + CEL_ID_END - CATS_RES_TBL_OFS,

	ANM_ID_MAIN = CATS_RES_TBL_OFS,
	ANM_ID_SUB,
	ANM_ID_POKEGRA,
	ANM_ID_END,
	ANM_ID_MAX = CMN_RES_NUM + ANM_ID_END - CATS_RES_TBL_OFS,
};

//=============================================================================
/**
 *								extern
 */
//=============================================================================

extern CATS_ACT_PTR OBJ_AddCommon( CATS_SYS_PTR csp, CATS_RES_PTR crp, s16 px, s16 py, u16 anm, u16 pri );
extern CATS_ACT_PTR OBJ_AddCommonSub( CATS_SYS_PTR csp, CATS_RES_PTR crp, s16 px, s16 py, u16 anm, u16 pri );
extern void SetBreakPokeParam( BREAK_POKE_PARAM* outParam, const u8 NetID, PKTHLN_PTR work );
extern void StaminaProc( BREAK_POKE_PARAM* BPP, const u32 HealTimer, const u8 PokeIdx );
extern u32 StaminaCalc( const u32 Stamina, const u16 AttackTimer );
